package com.yeyks.account.dal.dao;

import com.yeyks.account.dal.domain.AccountInfo;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yeyks.account.param.AccountInfoQueryParam;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;
import java.util.Map;


/**
 * <p>
 * 后台帐户表 Mapper 接口
 * </p>
 *
 * @author yun
 * @since 2019-06-25
 */
public interface AccountInfoMapper extends BaseMapper<AccountInfo> {

    List<AccountInfo> selectByPhoneOrUsername(@Param("phone") String phone, @Param("username") String username);

    AccountInfo selectByUsername(@Param("username") String username);

    List<AccountInfo> selectByType(@Param("type") Integer type);

    int modifyPasswordById(@Param("id") Integer id, @Param("password") String password);


    int updateExtraInfoById(@Param("id") Integer id, @Param("extraInfo") String extraInfo);

    List<AccountInfo> selectChildren(@Param("ids") List<Integer> ids);

    int countOfChildren(@Param("id") Integer id,
                        @Param("dtStart") Date dtStart,
                        @Param("dtEnd") Date dtEnd);

    int countOfHotelByCounty(@Param("id") Integer id,
                             @Param("dtStart") Date dtStart,
                             @Param("dtEnd") Date dtEnd);

    int countOfGrandchildren(@Param("id") Integer id,
                             @Param("dtStart") Date dtStart,
                             @Param("dtEnd") Date dtEnd);

    int countOfGrandchildchildren(@Param("id") Integer id,
                                  @Param("dtStart") Date dtStart,
                                  @Param("dtEnd") Date dtEnd);

//    int setPrecentage(@Param("admin") Integer admin,
//                      @Param("branch") Integer branch,
//                      @Param("city") Integer city);

    List<AccountInfo> queryList(AccountInfoQueryParam accountInfoQueryParam);

    Integer queryListCount(AccountInfoQueryParam accountInfoQueryParam);

    List<AccountInfo> querySubUserList(AccountInfoQueryParam accountInfoQueryParam);

    Integer querySubUserListCount(AccountInfoQueryParam accountInfoQueryParam);

    List<AccountInfo> selectTwoChildren(@Param("id") Integer id);

    AccountInfo selectByPrimaryKey(Integer id);

    /**
     * 查询用户的所有权限
     * @param userId  用户ID
     */
    List<String> queryAllPerms(Integer userId);

    /**
     * 查询用户的所有菜单ID
     */
    List<Long> queryAllMenuId(Integer userId);

    /**
     * 查询用户角色ID
     * @param userId
     * @return
     */
    List<Long> selectRoleIdList(Integer userId);

    /**
     *
     * @param type
     * @return
     */
    List<AccountInfo> queryNoRoleUser(Integer type);

    /**
     * 查询运营商、服务商
     * @param name
     * @return
     */
    List<AccountInfo> queryDeveloper(@Param("name")String name,@Param("accountType")Integer accountType);

//    List<Map> getPrecentage();

    /**
     * 通过酒店账户id获取酒店的所有上级
     *
     * @param id
     * @return
     */
    List<Integer> selectAllParentId(Integer id);

    List<AccountInfo> selectByIds(@Param("ids") List<Integer> ids);

    /**
     * 批量更新账户的divCode
     * @param accountInfoList 需要更新账户的集合
     * @return 返回结果
     */
    int updateAccountCodeBatch(@Param("list") List<AccountInfo> accountInfoList);

    /**
     * 分页查询账户信息
     * @param queryMap 查询条件map
     * @return 返回结果
     */
    List<AccountInfo> selectPageByMap(Map<String, Object> queryMap);

    /**
     * 查询子账号集合
     * @param accountId 账户Id
     * @return 返回结果
     */
    List<AccountInfo> selectChildAccountPageByAccountId(@Param("accountId") Integer accountId);

    /**
     * 登录的实现类
     * @param username 账号名称
     * @param password 密码
     * @return 返回结果
     */
    AccountInfo loginAccount(@Param("username") String username, @Param("password") String password);

    /**
     * 查询【运营商/服务商/卡商】集合
     * @param type 账号类型 10;运营商 11;服务商 12;卡商
     * @param name 服务商，运营商，卡商名称
     * @param username 管理员名称
     * @param accountIdList 该token下满足条件的账户列表
     * @return
     */
    List<AccountInfo> queryBusinessByPage(@Param("type") Integer type,
                                          @Param("name") String name,
                                          @Param("username") String username,
                                          @Param("list") List<Integer> accountIdList);

    /**
     * 查询【运营商/服务商/卡商】的相关条件的数量
     * @param type 账号类型 10;运营商 11;服务商 12;卡商
     * @param name 服务商，运营商，卡商名称
     * @param username 管理员名称
     * @param accountIdList 该token下满足条件的账户列表
     * @return
     */
    int queryCountByBusiness(@Param("type") Integer type,
                             @Param("name") String name,
                             @Param("username") String username,
                             @Param("list") List<Integer> accountIdList);

    /**
     * 【开发商】查询
     * @param name 名称
     * @param developType 1, 臻享开发商， 2，优享开发商
     * @return
     */
    List<AccountInfo> findDeveloper(@Param("name") String name,
                                    @Param("developType") Integer developType);

    /**
     *
     * 分页查询账户信息
     * @param queryMap 查询条件map
     * @return 返回结果
     */
    List<AccountInfo> selectBusinessPageByMap(Map<String, Object> queryMap);
}
